/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imp.gestores;

import imp.clases.*;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Angelical
 */
public class GestorPanelFinanciero {

    private Emprendimiento empren;
    List<ReporteFinanciero> reporteFinancieros;

    String datosMatriz[][];


    //Redondeo Nath
    NumberFormat nf= NumberFormat.getNumberInstance();

    public GestorPanelFinanciero(){
   // calculoTablaF();
        this.reporteFinancieros= new ArrayList<ReporteFinanciero>();

        //Formato de Numeros:
        DecimalFormat dec=(DecimalFormat)nf;
        dec.applyPattern("###.##");
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
    }
   


    public void calculoTablaF(){
        datosMatriz=new String [46][7];
        llenarEtiquetas();
       //Realizamos los calculos para generar la parte de Gastos de Personal:
       double totCI[][] = null;


       //Saco los campos de Inversiones:
       int tamano=empren.getPresupuestos().size();
       double valorInversion=0;
       for(int n=0;n<tamano;n++){
            valorInversion= valorInversion+empren.getPresupuestos().get(n).getValor();

       }

       //Saco Total Depreciables:
       double totDepreciables=0;
       double totNoDepreciables=0;
       for(int n=0;n<tamano;n++){
           if(empren.getPresupuestos().get(n).getDepreciable().booleanValue()){
            totDepreciables= totDepreciables+empren.getPresupuestos().get(n).getValor();
            }else{
            totNoDepreciables= totNoDepreciables+empren.getPresupuestos().get(n).getValor();
            }
       }

       datosMatriz[0][1]=String.valueOf(nf.format(totDepreciables));
       datosMatriz[1][1]=String.valueOf(nf.format(totNoDepreciables));



       //Pongo Sueldos Empleados

       for(int n=0;n<5;n++){

        double numE=empren.getSueldos().get(n).getNumEmpleados();
        double numO=empren.getSueldos().get(n).getNumObreros();
        double sueldoE=empren.getSueldos().get(n).getSueldoEmpleado();
        double sueldoO=empren.getSueldos().get(n).getSueldoObrero();

        datosMatriz[4][n+2]=String.valueOf(nf.format(numE));
        datosMatriz[5][n+2]=String.valueOf(nf.format(numO));
        datosMatriz[6][n+2]=String.valueOf(nf.format(sueldoE));
        datosMatriz[7][n+2]=String.valueOf(nf.format(sueldoO));

        //Calculo de Gastos Totales:
        double totSEmp=numE*sueldoE*12;
        double totSObr=numO*sueldoO*12;

        datosMatriz[8][n+2]=String.valueOf(nf.format(totSEmp));
        datosMatriz[9][n+2]=String.valueOf(nf.format(totSObr));

        //Condicion para Calculo de Incremento x Inflacion
        double inflacion=empren.getInflacion();
        if(inflacion==0){inflacion=0.03;}//Valido para 0

        if(n==0){
         inflacion=1;
        }else{
         inflacion=(1+(Math.pow(inflacion,n)));
        }


        //Cot IESS (Suponemos que el porcentaje es: 11.15%)
        double porIess=empren.getIess();
        if(porIess==0){porIess=0.1115;}//Valido para 0
        
        double cotIess=(totSEmp+totSObr)*porIess*inflacion;
        datosMatriz[10][n+2]=String.valueOf(nf.format(cotIess));

        //13er Sueldo
        double d13=((totSEmp+totSObr)/12)*inflacion;
        datosMatriz[11][n+2]=String.valueOf(nf.format(d13));

        //14to Sueldo (Suponemos salario minimo 240USD
        double sueldoBasico=empren.getSueldobasico();
        if(sueldoBasico==0){sueldoBasico=240;}//Valido para 0

        double d14=((numE+numO)*sueldoBasico)*inflacion;
        datosMatriz[12][n+2]=String.valueOf(nf.format(d14));

        //Calculo de los fondos de Reserva:
        double fondoR=((totSEmp+totSObr)/12)*inflacion;
        datosMatriz[13][n+2]=String.valueOf(nf.format(fondoR));

        //Total de Gastos de Personal:
        double totalGastosPer=totSEmp+totSObr+cotIess+d13+d14+fondoR;
        datosMatriz[14][n+2]=String.valueOf(nf.format(totalGastosPer));



       //Pongo los Gastos Administrativos:

        //Establesco el numero de meses:
        double numPeriodos=12;

        //Calculo para el primer ano:
        double arriendo=empren.getArriendo()*numPeriodos*inflacion;
        double suministro=empren.getSuministros()*numPeriodos*inflacion;
        double servicios=empren.getBasicos()*numPeriodos*inflacion;
        double generales=empren.getGenerales()*numPeriodos*inflacion;
        double legales=empren.getLegales()*inflacion;
        double permisos=empren.getPatentes()*inflacion;

        datosMatriz[16][n+2]=String.valueOf(nf.format(arriendo));
        datosMatriz[17][n+2]=String.valueOf(nf.format(suministro));
        datosMatriz[18][n+2]=String.valueOf(nf.format(servicios));
        datosMatriz[19][n+2]=String.valueOf(nf.format(generales));
        datosMatriz[20][n+2]=String.valueOf(nf.format(legales));
        datosMatriz[21][n+2]=String.valueOf(nf.format(permisos));
        
        //Total de Gastos Administrativos:
        double totGastosAd=arriendo+suministro+servicios+generales+legales+permisos;
        datosMatriz[22][n+2]=String.valueOf(nf.format(totGastosAd));

       //Total de Gastos:
        double totGastos=totGastosAd+totalGastosPer;
        datosMatriz[24][n+2]=String.valueOf(nf.format(totGastos));


        //Saco Matriz Costos-Ingresos
        totCI=llenoMCostos();

        //Saco Matriz de Total Costos:
        double totCostos=totCI[n][0];
        datosMatriz[26][n+2]=String.valueOf(nf.format(totCostos));

        //Saco Matriz de Total Costos+Gastos:
        double totCG=totCostos+totGastos;
        datosMatriz[28][n+2]=String.valueOf(nf.format(totCG));
        
        //Saco Matriz de Total Ingresos :
        double totIngresos=totCI[n][1];
        datosMatriz[30][n+2]=String.valueOf(nf.format(totIngresos));


        //Saco el Resultado Operativo:
        double resOpe=totIngresos-totCG;
        datosMatriz[32][n+2]=String.valueOf(nf.format(resOpe));

        //Calculos Adicionales:
         //Calculo Capital de Trabajo y total de la inversion
       if(n==0){
       double capitalTrabajo=((Double.valueOf(datosMatriz[24][2]))/4)+((Double.valueOf(datosMatriz[26][2]))/4);
       valorInversion=capitalTrabajo+valorInversion;
       datosMatriz[2][1]=String.valueOf(nf.format(capitalTrabajo));
       datosMatriz[38][1]=String.valueOf(nf.format(-valorInversion));
       }

        //Calculo de las Amortizaciones al (10% para 5 anos)
        double tasaAmortizacion=empren.getTasa();
        if(tasaAmortizacion==0){tasaAmortizacion=0.1;}//Valido para 0

        double valAmortizacion=this.calcularPago(valorInversion, tasaAmortizacion,5);
        datosMatriz[33][n+2]=String.valueOf(nf.format(valAmortizacion));

        //Calculo de las Depreciaciones: (Suponemos 20% depreciacion)
        double valDepreciacion=totDepreciables*0.2;
        datosMatriz[34][n+2]=String.valueOf(nf.format(valDepreciacion));

        //Calculo la participacion Laboral:
        double utilidadDAD=resOpe-valAmortizacion-valDepreciacion;
        double partLaboral=0;
        if(utilidadDAD>0){
            //Suponemos una participacion de 15% para Trabajadores
            partLaboral=utilidadDAD*0.15;
        }else{}
        datosMatriz[35][n+2]=String.valueOf(nf.format(partLaboral));

        //Calculo la impuesto a la Renta
        double impRenta=0;
        if(utilidadDAD>0){
            //Suponemos un impuesto de 25%
            impRenta=(utilidadDAD-partLaboral)*0.25;

        }else{}
        datosMatriz[36][n+2]=String.valueOf(nf.format(impRenta));


        //Pongo los totales Resultado Neto:
        double resNeto=0;

//          if(n==0){
//          resNeto=-valorInversion;
//          }else{
          resNeto=resOpe-valAmortizacion-valDepreciacion-partLaboral-impRenta;
//          }
        datosMatriz[38][n+2]=String.valueOf(nf.format(resNeto));
        

       }

      



       //Pongo los datos de Resultados:

       //Pongo los datos del Crecimiento de Ventas
       double crecVentas=Math.pow((totCI[4][1]/totCI[0][1]),0.25)-1;
       crecVentas=crecVentas*100;
       datosMatriz[42][1]=String.valueOf(nf.format(crecVentas))+"%";

       //Pongo los datos Crecimiento de Costos y Gastos
       double crecCostGast=Math.pow((Double.valueOf(datosMatriz[28][6])/Double.valueOf(datosMatriz[28][2])),0.25)-1;
       crecCostGast=crecCostGast*100;
       datosMatriz[43][1]=String.valueOf(nf.format(crecCostGast))+"%";




       //Saco los flujos de caja:
       double[] flujosEfectivo=new double[6];
       for(int n=0;n<6;n++){
        flujosEfectivo[n]=Double.valueOf(datosMatriz[38][n+1]);

       }



       FuncionesFinancieras ff=new FuncionesFinancieras();
       //Pongo VAN
       double van=ff.regularNPV(flujosEfectivo,0.1 );

       datosMatriz[44][1]=String.valueOf(nf.format(van));


      

    pasoMaReporteFinancieros();

    }








    public double calcularPago(double precio,double intAnual,double periodos) {
        double princ = precio;
        double intRate = intAnual;
        double numPeriodos = periodos;
        double pmt = Math.floor((princ*intRate)/(1-Math.pow(1+intRate,(-1*numPeriodos)))*100)/100;
        return pmt;
    }

//    public static void main(String args[]){
//     GestorPanelFinanciero gpf=new GestorPanelFinanciero();
//     gpf.calcularPago(17196, 0.1, 5);
//    }




    public double[][] llenoMCostos(){
        double matrizCstIng[][]=new double[5][2];

        //Saco los costos Totales
        //Total de Costos: (Pongo linea de costos)

               int tamanoc = empren.getCostos().size();
               double datoa1=0;
               double datoa2=0;
               double datoa3=0;
               double datoa4=0;
               double datoa5=0;



               for (int i = 0; i < tamanoc; i++) {
                   datoa1 = datoa1+empren.getCostos().get(i).getAnio1();
                   datoa2 = datoa2+empren.getCostos().get(i).getAnio2();
                   datoa3 = datoa3+empren.getCostos().get(i).getAnio3();
                   datoa4 = datoa4+empren.getCostos().get(i).getAnio4();
                   datoa5 = datoa5+empren.getCostos().get(i).getAnio5();
               }

               //Pongo en la matriz los costos:
               matrizCstIng[0][0]=datoa1;
               matrizCstIng[1][0]=datoa2;
               matrizCstIng[2][0]=datoa3;
               matrizCstIng[3][0]=datoa4;
               matrizCstIng[4][0]=datoa5;


        //Saco los Ingresos Totales
        //Total de Ingresos: (Pongo linea de ingresos)

               tamanoc = empren.getIngresosmensuales().size();
               datoa1=0;
               datoa2=0;
               datoa3=0;
               datoa4=0;
               datoa5=0;



               for (int i = 0; i < tamanoc; i++) {
                   datoa1 = datoa1+empren.getIngresosmensuales().get(i).getAnio1();
                   datoa2 = datoa2+empren.getIngresosmensuales().get(i).getAnio2();
                   datoa3 = datoa3+empren.getIngresosmensuales().get(i).getAnio3();
                   datoa4 = datoa4+empren.getIngresosmensuales().get(i).getAnio4();
                   datoa5 = datoa5+empren.getIngresosmensuales().get(i).getAnio5();
               }

               //Pongo en la matriz los ingresos:
               matrizCstIng[0][1]=datoa1;
               matrizCstIng[1][1]=datoa2;
               matrizCstIng[2][1]=datoa3;
               matrizCstIng[3][1]=datoa4;
               matrizCstIng[4][1]=datoa5;




               return matrizCstIng;



    }


    public void pasoMaReporteFinancieros(){
        int tamano=datosMatriz.length;
        reporteFinancieros.clear();
        for(int n=0;n<tamano;n++){

            ReporteFinanciero linea =new ReporteFinanciero();
            linea.setValor1(datosMatriz[n][0]);
            linea.setValor2(datosMatriz[n][1]);
            linea.setValor3(datosMatriz[n][2]);
            linea.setValor4(datosMatriz[n][3]);
            linea.setValor5(datosMatriz[n][4]);
            linea.setValor6(datosMatriz[n][5]);
            linea.setValor7(datosMatriz[n][6]);

            reporteFinancieros.add(linea);

        }



    }


    public void llenarEtiquetas(){

        //Lleno con los nombres de las Etiquetas:
        datosMatriz[0][0]="Inversion Depreciable:";
        datosMatriz[1][0]="Invercion No Depreciable:";
        datosMatriz[2][0]="Capital de Trabajo:";
        datosMatriz[3][0]="";
        datosMatriz[4][0]=" Num Empleados";
        datosMatriz[5][0]=" Num Obreros";
        datosMatriz[6][0]=" SueldoEmpleados";
        datosMatriz[7][0]=" SueldoObreros";
        datosMatriz[8][0]=" Gastos Sueldos Empleados";
        datosMatriz[9][0]=" Gastos Sueldos Obreros";
        datosMatriz[10][0]=" Cotizacion del IESS";
        datosMatriz[11][0]=" 13vo";
        datosMatriz[12][0]=" 14vo";
        datosMatriz[13][0]=" Fondo de Reserva";
        datosMatriz[14][0]=" Gastos por el Personal";
        datosMatriz[15][0]="";
        datosMatriz[16][0]=" Arriendos";
        datosMatriz[17][0]=" Suministros";
        datosMatriz[18][0]=" Servicios Basicos";
        datosMatriz[19][0]=" Generales";
        datosMatriz[20][0]=" Legales";
        datosMatriz[21][0]=" Permisos y Patentes";
        datosMatriz[22][0]=" Gastos por el Administrativo";
        datosMatriz[23][0]="";
        datosMatriz[24][0]="Total Gastos";
        datosMatriz[25][0]="";
        datosMatriz[26][0]="Total Costos";
        datosMatriz[27][0]="";
        datosMatriz[28][0]="Total (Costos+Gastos)";
        datosMatriz[29][0]="";
        datosMatriz[30][0]="Total Ingresos";
        datosMatriz[31][0]="";
        datosMatriz[32][0]="Resultado Operativo";
        datosMatriz[33][0]="Amortizacion";
        datosMatriz[34][0]="Depreciacion";
        datosMatriz[35][0]="Participacion Laboral";
        datosMatriz[36][0]="Impuesto a la Renta";
        datosMatriz[37][0]="";
        datosMatriz[38][0]="Resultado Neto";
        datosMatriz[39][0]="";
        datosMatriz[40][0]="";
        datosMatriz[41][0]="Ratios e Indicadores";
        datosMatriz[42][0]="Crecimiento en Ventas";
        datosMatriz[43][0]="Crecimiento Costos y Gastos";
        datosMatriz[44][0]="VAN";
        datosMatriz[45][0]="TIR";
        
        


    }

    public Emprendimiento getEmpren() {
        return empren;
    }

    public void setEmpren(Emprendimiento empren) {
        this.empren = empren;
    }

    public List<ReporteFinanciero> getReporteFinancieros() {
        return reporteFinancieros;
    }

    public void setReporteFinancieros(List<ReporteFinanciero> reporteFinancieros) {
        this.reporteFinancieros = reporteFinancieros;
    }


    public void calcularTotales(){


    }



}

